package com.swyc.osschat.Test.designMode.builder.run;

import com.swyc.osschat.Test.designMode.builder.impl.ComputerBuilder;

/**
 * @description Java 建造者模式
 * 一、简介
 *  将一个复杂对象的构造与它的表示分离，使同样的构建过程可以创建不同的表示，这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象，然后一步一步构建而成。它将变与不变相分离，即产品的组成部分是不变的，但每一部分是可以灵活选择的。
 * 二、实现
 *  在建造者模式中，主要角色如下：
 *      抽象建造者：接口/抽象类 规定要实现复杂对象的创建，但不涉及具体对象的创建。
 *      具体建造者：实现抽象建造者，完成复杂对象的各个部件的具体创建方法，并提供构建好的对象。
 *      指挥者：调用具体建造者来创建复杂对象的各个部分，在指挥者中不涉及具体的产品信息，只负责对象各部分的创建或按照某种顺序创建。
 *      产品：要创建的复杂对象。
 * 三、扩展
 * @Author: z156940l@outlook.com
 * @className Test
 * @Date: 2022/7/25 18:04
 */
public class Test {
    public static void main(String[] args) {
        test1();
        test2();
    }

    /**
     * 比如我要组装一台电脑，这个电脑由主板，内存，cpu组合而成，而且也是有一定的安装顺序，比如必须要先安装主板再安装cpu，这个过程由指挥者来完成
     * 。接下来看代码：
     * 至此，就已经通过建造者模式创建出了我们想要的复杂的产品。其中ComputerDirector有着很重要的作用，它用于指导具体构建的过程或顺序，
     * 并返回产品类，但是日常开发中，我们通常会简化它，即把指挥者类和抽象建造者结合。
     */
    private static void test1(){
        //创建建造者
        ComputerBuilder builder = new ComputerBuilder();
        //创建指挥者
        ComputerDirector computerDirector = new ComputerDirector(builder);
        //生产产品
        Computer computer = computerDirector.construct("华硕主板","英特尔Cpu","金士顿8G内存");
        System.out.println(computer);
    }

    /**
     * 拓展写法：
     * 建造者模式除了上面的用途外，在开发中还有一种常用的方法，
     * 上面的computerDirector.construct("华硕主板","英特尔Cpu","金士顿8G内存");
     * 传入了很多的参数，如果参数更多怎么办？很容易发生错误可读性变差，接下来看看我们的常用写法。
     * 这种方式使用起来更方便，提高开发效率，可以链式调用，再使用一些三方的框架时，其中的链式调用就是这样实现的。
     */
    private static void test2(){
        Computer computer = new Computer.Builder()
                .buildMainBoard("华硕主板")
                .buildCpu("英特尔Cpu")
                .buildRam("金士顿8G内存")
                .build();
        System.out.println(computer);
    }
}
